#ifndef _sdl_mesh_h_
#define _sdl_mesh_h_

#include "sdl_vbomap.h"
#include "sdl_mvector.h"
#include "sdl_my_opengl.h"
#include "sdl_prim.h"
#include "sdl_ptr.h"
#include "sdl_texdata.h"
#include "sdl_indexmap.h"
#include <vector>
#include <string>

namespace sdl_graphic {

    /*
     * TODO: globalne repozytorium materiałów
     *
     * TODO: globalne repozytorium tekstur
     */

    ///informacje o materiale, wielokrotnym teksturowaniu itd.

    struct material : public sdl_prim {
        ///dopuszczamy wiele tekstur na materiał oczywiście, proponuję pobierać je z globalnego repozytorium
        std::vector<sdl_ptr<sdl_base_texdata> > textures;
        // więcej własności idzie tu...
        mvector4f ambient;
        mvector4f diffuse;
        mvector4f specular;
        float shininess;
        mvector4f emission;
        bool double_sided;
        material(const std::string & n);
        virtual ~material();
    };


    ///siatka przestrzenna wraz ze zbiorem materiałów

    class mesh : public sdl_prim,
    depends<sdl_debug::debug> {
        friend class loader3ds;
        friend class loaderX;
        friend class renderer;

        /**
         * \brief mapa materiałowa!
         * Bierzemy podzbiory wszystkich wierzchołków i określamy na nich mapowania odpowiadające materiałom. matmap odnosi się do mesh::indices (tablicy indeksów)
         */

        struct matmap {
            /*
            int	offset;
            sdl_ptr<material> 	mat;
            sdl_ptr<vertex_vmap> 		vertices;
            sdl_ptr<vertex_vmap>		normals;
            sdl_ptr<color_vmap>		colors;
            std::vector<sdl_ptr<tex_vmap> >		texcoords;
            / **
             * trzeba określić odpowiedni zakres map za pomocą funkcji vertexmap::range albo operatora (int,int)!
             * Pamiętać o tym, że wierzchołków teksturowych musi wystarczyć na wszystkie tekstury! Nawet z dublowaniem!
             * /
            matmap(const int & off,const sdl_ptr<vertex_vmap> & vmap, const sdl_ptr<vertex_vmap> & nmap, const sdl_ptr<color_vmap> & cmap, const std::vector<sdl_ptr<tex_vmap> > &tmap, const sdl_ptr<material> & m);
            ~matmap();
             */
            GLenum mode;
            int start, end, count; ///<parametry przekazywane do glDrawRangeElements, odnoszą się do mapy mesh::indices

            matmap(int s, int e, int c, const sdl_ptr<material> & m) : start(s), end(e), count(c), mat(m), mode(GL_TRIANGLES) {
            }
            sdl_ptr<material> mat;
        };

        ///mapy materiałowe
        std::vector<matmap> matmaps;
        ///tablica indeksów wierzchołków
        sdl_ptr<indexmap> indices;
        ///wierzchołki
        sdl_ptr<vertex_vmap> vertices;
        ///wektory normalne
        sdl_ptr<normal_vmap> normals;
        ///kolory
        sdl_ptr<color_vmap> colors;
        ///współrzędne teksturowania (kilka tekstur)
        std::vector<sdl_ptr<tex_vmap> > texcoords;
        ///promień sfery ograniczającej
        float radius;
    public:
        ///konstruktor nie określa wierzchołków!
        mesh(const std::string & name);
        virtual ~mesh();
        /**
         * Podstawienie map wierzchołków
         */
        void create(const sdl_ptr<mvector3fmap> & vmap, const sdl_ptr<mvector3fmap> & nmap, const sdl_ptr<mvector4fmap> & cmap, const std::vector<sdl_ptr<mvector2fmap> > & tmap, const sdl_ptr<indexmap> &);
        /*
        void v_subst(const sdl_ptr<mvector3fmap> & vmap) ;
        void c_subst(const sdl_ptr<mvector4fmap> & cmap) ;
        void n_subst(const sdl_ptr<mvector3fmap> & nmap) ;
        void t_subst(const std::vector<sdl_ptr<mvector2fmap> > &tmap) ;
        sdl_ptr<vertex_vmap> get_vertices() ;
        sdl_ptr<normal_vmap> get_normals() ;
        sdl_ptr<color_vmap>  get_colors() ;
        std::vector<sdl_ptr<tex_vmap> > get_texcoords() ;
         */
        float get_radius();
        /**
         * ustawienie jednego materiału na cały model (trywialna mapa materiałowa)
         */
        void set_material(const sdl_ptr<material> & mat);
    };

}; //namespace sdl_graphic


#endif //_sdl_mesh_h_

